package com.ckzp.jfinal.system.util;


import com.ckzp.core.model.Datas;
import com.ckzp.core.util.DateUtil;
import com.jfinal.plugin.ehcache.CacheKit;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Created by 51594 on 2022/3/28.
 */
public class SysCacheUtil {

    public static Datas getCacheSpaceInfo() {
        String[] slist = CacheKit.getCacheManager().getCacheNames();
        List<Datas> flist = new ArrayList();
        for (String s : slist) {
            Datas d = Datas.n().add("name", s);
            Cache cache = CacheKit.getCacheManager().getCache(s);
            d.add("size", cache.getSize());
            d.add("diskstore", cache.getDiskStoreSize());
            d.add("eternal", cache.getCacheConfiguration().isEternal() ? "<font color=green>是</font>" : "否");
            d.add("todisk", cache.getCacheConfiguration().isOverflowToDisk() ? "<font color=green>是</font>" : "否");
            d.add("maxmemory", cache.getCacheConfiguration().getMaxElementsInMemory());
            d.add("maxdisk", cache.getCacheConfiguration().getMaxElementsOnDisk());
            d.add("maxdiskmb", cache.getCacheConfiguration().getDiskSpoolBufferSizeMB());
            d.add("livesecond", cache.getCacheConfiguration().getTimeToLiveSeconds());
            d.add("toidsecond", cache.getCacheConfiguration().getTimeToIdleSeconds());
            d.add("all", cache.toString());
//            List l = cache.getKeys();
//            for (Object oo : l) {
//                out.print("<br>oo==" + oo);
//                out.print("<br>oo==" + cache.get(oo));
//            }
            flist.add(d);
        }
        return Datas.n().add("space_list", flist);
    }

    /**
     * 查看空间key列表
     *
     * @param space
     * @return
     */
    public static Datas getCacheKeysInfo(String space) {
        Cache cache = CacheKit.getCacheManager().getCache(space);
        List<String> keys = cache.getKeys();
        List<Datas> flist = new ArrayList();
        for (String s : keys) {
            Datas d = Datas.n().add("name", s);
            flist.add(d);
        }
        return Datas.n().add("keys_list", flist);
    }

    /**
     * 查看空间key值
     *
     * @param space
     * @return
     */
    public static Datas getCacheValueInfo(String space, String key) {
        Object value = CacheKit.get(space, key);
        Element el = CacheKit.getCacheManager().getCache(space).get(key);
        List<Datas> flist = new ArrayList();
        int index = 0;
        if (value instanceof List) {
            List l = (List) value;
            for (Object o : l) {
                Datas d = Datas.n().add("name", o.getClass().getName() + "@" + o.hashCode());
                d.add("view", o.toString());
                d.add("index", index);
                index++;
                flist.add(d);
            }
        } else if (value != null) {
            flist.add(Datas.n().add("name", value).add("view", value).add("index", 0));
        } else {
            flist.add(Datas.n().add("name", "空"));
        }
        Datas ret = Datas.n().add("value_list", flist);
        if (el != null) {
            ret.add("c_date", DateUtil.getDateTime(new Date(el.getCreationTime())));
            ret.add("hitcount", el.getHitCount());
        }
        return ret;
    }


    /**
     * 查看空间key值
     *
     * @param space
     * @return
     */
    public static Datas delCache(String space, String key) {
        CacheKit.remove(space, key);
        return Datas.n();
    }
}
